package com.bosssoft.cloud.wechat.infrastructure.enums;

import lombok.Getter;

/**
 * 错误码enum
 * <p>
 * 错误产生来源分为 A/B/C，A 表示错误来源于用户，比如参数错误;
 * B 表示错误来源于当前系统，往往是业务逻辑出错，或程序健壮性差等问题;
 * C 表示错误来源于第三方服务，比如 CDN 服务出错;
 * 四位数字编号大类之间的步长间距预留100,小类预留10
 *
 * @author wcy create on 2021/7/23 10:13 上午
 */

@Getter
public enum ErrEnum implements ReturnEnum {

    /*
    +++++++++++++++++++++++ 用户端错误 +++++++++++++++++++++++
     */
    A0001("A0001", "用户端错误"),

    /* 用户注册错误 */
    A0100("A0100", "用户注册错误"),
    // 用户名
    A0110("A0110", "用户名校验失败"),
    // 密码
    A0120("A0120", "密码校验失败"),
    // 验证码
    A0130("A0130", "校验码输入错误"),
    A0131("A0131", "短信校验码输入错误"),
    A0132("A0132", "邮件校验码输入错误"), // 目前无邮件校验码功能，邮箱验证用图片验证码
    A0134("A0134", "图片验证码输入错误"),
    /* 用户登陆异常 */
    A0200("A0200", "用户登陆异常"),
    // 账户
    A0201("A0201", "用户账户不存在"),
    A0202("A0202", "用户账户被冻结"),
    A0203("A0203", "用户账户已作废"),
    // 密码
    A0210("A0210", "用户密码错误"),
    A0211("A0211", "用户输入密码次数超限"),
    // 身份校验
    A0220("A0220", "用户身份校验失败"),
    A0223("A0223", "用户未获得第三方登陆授权"),
    // 登陆过期
    A0230("A0230", "用户登陆已过期"),
    A0231("A0231", "用户未登陆"),
    // 验证码
    A0240("A0240", "用户验证码错误"),

    /* 访问异常 */
    A0300("A0300", "访问权限异常"),
    A0320("A0320", "用户访问被拦截"),
    A0321("A0321", "黑名单用户"),
    A0322("A0322", "账号被冻结"),
    A0323("A0323", "非法IP地址"),
    A0324("A0324", "网关访问受限"),

    /* 请求参数错误 */
    A0400("A0400", "用户请求参数错误"),
    A0401("A0401", "包含非法恶意跳转链接"),
    A0402("A0402", "无效的用户输入"),
    A0403("A0403", "参数校验错误"),
    // 必填参数为空
    A0410("A0410", "请求必填参数为空"),
    A0411("A0411", "验证码为空"),
    // 超出范围
    A0420("A0420", "请求参数值超出允许的范围"),

    // 用户输入内容非法
    A0430("A0430", "用户输入内容非法"),
    A0434("A0434", "票据解析失败"),
    // 用户操作异常
    A0440("A0440", "用户操作异常"),

    /* 用户请求服务异常 */
    A0500("A0500", "用户请求服务异常"),
    A0501("A0501", "请求次数超出限制"),

    /*
    +++++++++++++++++++++++ 系统错误 +++++++++++++++++++++++
     */
    B0001("B0001", "系统执行出错"),
    // 注：是因为系统健壮性等原因执行如okhttp的方法出错，而C0001错误来源于第三方
    B0002("B0002", "执行第三方接口请求错误"),
    // 超时
    B0100("B0100", "系统执行超时"),
    // 参数处理
    B0400("B0400", "参数处理错误"),
    // 反射
    B0410("B0410", "反射方法错误"),
    // 加密
    B0420("B0420", "加密算法错误"),
    B0421("B0421", "SHA1签名加密错误"),

    /*
    +++++++++++++++++++++++ 调用第三方服务出错 +++++++++++++++++++++++
     */
    C0001("C0001", "调用第三方服务出错"),
    /* 中间件服务出错 */
    C0100("C0100", "中间件服务出错"),
    // RPC服务，主要是dubbo
    C0110("C0110", "RPC服务出错"),
    C0111("C0110", "RPC服务未找到"),
    C0112("C0112", "RPC服务未注册"),
    C0113("C0113", "接口不存在"),
    C0114("C0114", "RPC服务查询结果为空"),
    C0115("C0115", "RPC服务操作失败"),

    /* 第三方系统执行超时 */
    C0200("C0200", "第三方系统执行超时"),
    // RPC超时
    C0210("C0210", "RPC执行超时"),
    C0250("C0250", "数据库服务超时"),

    /* 数据库服务出错 */
    C0300("C0300", "数据库服务出错"),
    C0311("C0311", "表不存在"),
    C0312("C0312", "列不存在"),
    C0321("C0321", "多表关联中存在多个相同名称的列"),
    C0331("C0331", "数据库死锁"),
    C0341("C0341", "主键冲突"),

    /* 通知服务 */
    C0500("C0500", "通知服务出错"),
    C0501("C0501", "短信提醒服务失败"),
    C0502("C0502", "语音提醒服务失败"),
    C0503("C0503", "邮件提醒服务失败"),

    /* 微信公众号服务 */
    CO600("C0600", "微信公众号错误"),
    C0601("C0601", "微信公众号API调用错误"),
    // 网页授权异常
    C0610("C0610", "公众号网页授权错误"),
    C0611("C0611", "公众号获取授权code失败"),
    C0612("C0612", "公众号授权code换取网页授权token失败"),
    // 签名授权
    C0620("C0620", "公众号签名授权错误"),
    C0621("C0621", "公众号获取access_token失败"),
    C0622("C0622", "公众号获取jsapi_ticket失败"),
    // 模板消息
    C0630("C0630", "公众号模板消息异常"),
    C0631("C0631", "公众号发送模板消息异常"),
    C0632("C0632", "公众号设置所属行业异常"),
    // 菜单异常
    C0640("C0640", "公众号菜单异常"),
    C0641("C0641", "公众号创建菜单失败"),

    /*
    其他
     */

    LIMIT_ERR("3", "访问超出限制"),
    SECURITY_ERR("4", "安全码错误"),
    SYS_ERR("-1", "系统异常"),
    SUCCESS("0", "成功"),
    PARAM_ERR("1", "参数错误"),
    IDENTITY_ERR("2", "身份失效"),
    METHOD_ERR("1003", "不支持的方法"),
    INTERFACE_ERR("-1", "调用接口异常"),
    IDENTITY_NOT_EXISTS("1004", "人员不存在"),
    USER_DATA_ERR("2001", "操作失败"),
    USER_IDENTITY_ERR("2002", "身份失效"),
    USER_JSCODE_ERROR("2003", "jsCode过期"),
    IMAGE_SHIBIE_ERR("3001", "识别异常"),
    EMPTY_DATA_ERR("4001", "查询数据为空"),
    EIPS_ERR_EMPTY("5001", "查询结果为空"),
    EIPS_ERR_TOKEN("6001", "查询用户失败"),
    EIPS_ERR_PART("5002", "返回部分数据"),
    NOT_OWN_BILL("5003", "非本省票据无法查验"),
    RESULT_EMPTY("1005", "结果为空"),
    ;


    private final String code;
    private final String message;

    ErrEnum(String code, String message) {
        this.code = code;
        this.message = message;
    }
}
